#include<reg51.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define key P0	
#define lcdport P2
 sbit col1=key^4;
 sbit col2=key^5;
 sbit col3=key^6;
 sbit col4=key^7;
 sbit row1=key^0;
 sbit row2=key^1;
 sbit row3=key^2;
 sbit row4=key^3;
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit sw1=P3^6;
sbit sw2=P3^7;
sbit buzzer=P3^5;
unsigned int b=10000;
unsigned int w=0;
unsigned char c;
int num[10];
char i,rx_data[50];
char rfid[13],ch=0;
char pass[4];
 void delay(int itime)
{
    int i,j;
    for(i=0;i<itime;i++)
    for(j=0;j<1275;j++);
}

void lcdcmd(unsigned char comm)   //Lcd command funtion
{
     lcdport=comm;
     en=1;
     rs=0;
     rw=0;
     delay(1);
     en=0;
}
void lcddata(unsigned char disp)  //Lcd data function
{
     lcdport=disp;
     en=1;
     rs=1;
     rw=0;
     delay(1);
     en=0;
}

void lcd_num(unsigned int i)     //Function to send data on LCD
{   
	int p;
int k=0;
while(i>0)
{
  num[k]=i%10;
  i=i/10;
  k++;
}
k--;
for (p=k;p>=0;p--)
{
  c=num[p]+48;
  lcdport = c;
  rw = 0;
  rs = 1;
  en = 1;
  delay(1);
  en = 0;
}
return;
}

void lcdstring(char *str)
{
    while(*str)
    {
        lcddata(*str);
        str++;
    }
}
void lcd_init()                  //Function to inisialize the LCD
{
    lcdcmd(0x38);           
    delay(5);
    lcdcmd(0x0F);        
    delay(5);
    lcdcmd(0x80);
    delay(5);
} 
void uart_init()
{
 TMOD=0x20;
 SCON=0x50;
 TH1=0xfd;
 TR1=1;
	TI   = 1; 
}


char rxdata()
{
  while(!RI);
    ch=SBUF;    
    RI=0;
    return ch;
}
void keypad()
{
    i=0;
    while(i<4)
    {
     col1=0;
     col2=col3=col4=1;
     if(!row1)
     {
        lcddata('1');
        pass[i++]='1';
        while(!row1);
   }
     
      else if(!row2)
     {
        lcddata('4');
        pass[i++]='4';
        while(!row2);
   }
     
      else if(!row3)
     {
        lcddata('7');
        pass[i++]='7';
        while(!row3);
   }
     
      else if(!row4)
     {
        lcddata('*');
        pass[i++]='*';
        while(!row4);
   }
     
     col2=0;
     col1=col3=col4=1;
     if(!row1)
     {
        lcddata('2');
        pass[i++]='2';
        while(!row1);
   }
     
      else if(!row2)
     {
        lcddata('5');
        pass[i++]='5';
        while(!row2);
   }
     
      else if(!row3)
     {
        lcddata('8');
        pass[i++]='8';
        while(!row3);
   }
     
      else if(!row4)
     {
        lcddata('0');
        pass[i++]='0';
        while(!row4);
   }
     
     col3=0;
     col1=col2=col4=1;
     if(!row1)
     {
        lcddata('3');
        pass[i++]='3';
        while(!row1);
   }
     
      else if(!row2)
     {
        lcddata('6');
        pass[i++]='6';
        while(!row2);
   }
     
      else if(!row3)
     {
        lcddata('9');
        pass[i++]='9';
        while(!row3);
   }
     
      else if(!row4)
     {
        lcddata('#');
        pass[i++]='#';
        while(!row4);
   }
     
      col4=0;
     col1=col3=col2=1;
     if(!row1)
     {
        lcddata('A');
        pass[i++]='A';
        while(!row1);
   }
     
      else if(!row2)
     {
        lcddata('B');
        pass[i++]='B';
        while(!row2);
   }
     
      else if(!row3)
     {
        lcddata('C');
        pass[i++]='C';
        while(!row3);
   }
     
      else if(!row4)
     {
        lcddata('D');
        pass[i++]='D';
        while(!row4);
   }
 } 
     
}
void accept()
{
     lcdcmd(1);
     lcdstring("  Welcome  ");
     lcdcmd(192);
     lcdstring(" PIN Accept ");
     delay(200);
}
void wrong()
{
          buzzer=1;
                lcdcmd(1);
                lcdstring("!Incorrect PIN!");
                lcdcmd(192);
                lcdstring("PLZ Try Again");
                delay(200);
                buzzer=0;
}

int my_atoi(char *str)
{
		int i,res = 0; // Initialize result
  
    // Iterate through all characters of input string and
    // update result
    for (i = 0; str[i+1] != '\0'; ++i)
        res = res*10 + str[i] - '0';
  
    // return result.
    return res;
}


void main()
{
    buzzer=0;
    uart_init();
    lcd_init();
    lcdstring("   WELCOME TO   ");
    lcdcmd(0xc0);
    lcdstring("  MY BANK ATM  "); 
    delay(400);
    while(1)
    {
        lcdcmd(1);
        lcdstring("Pl show ATM Card");
        lcdcmd(0xc0);
        i=0;
        for(i=0;i<12;i++)
        rfid[i]=rxdata();
        rfid[i]='\0';
        lcdcmd(1);
        lcdstring("ATM Number is: ");
        lcdcmd(0xc0);
        for(i=0;i<12;i++)
        lcddata(rfid[i]);
        delay(100);
        if(strncmp(rfid,"510028E3B42E",12)==0)
        {
						lcdcmd(1);
						lcdstring("Enter Ur PIN :");
						lcdcmd(0xc0);
            keypad();
            if(strncmp(pass,"1111",4)==0)
            {
            accept();
            lcdcmd(1);
            lcdstring("Access Granted ");
            lcdcmd(0xc0);
            lcdstring("Person1");
						delay(100);
						lcdcmd(1);
            lcdstring("press sw1: BALNC");
            lcdcmd(0xc0);
            lcdstring("press sw2: WITDR");
						delay(10);
							while(1)
						{
										if(sw1==0)
										{
													lcdcmd(1);
													lcdstring("Your balance is :");
													lcdcmd(0xc0);
													lcd_num(b);
											delay(800);
											break;
										}
										else if(sw2==0)
										{
													int k=0;
													lcdcmd(1);
													lcdstring("Enter amnt WDR:");
													lcdcmd(0xc0);
													keypad();
													w=my_atoi(pass);
																if(b<w)
																{
																		lcdcmd(1);
																		lcdstring("Insufficient Balance");
																		lcdcmd(0xc0);
																		lcdstring("Thanks for visit");
																		delay(500);
																		break;
																}
																else
																{
													b=b-w;
													lcdcmd(1);
													lcdstring("Your balance is : ");
													lcdcmd(0xc0);
													lcd_num(b);
											delay(100);
										uart_init();                                                                                                 //serial initialization
            						printf("AT+CMGF=1%c",13);    
						delay(20);  //Text Mode            | hex value of 13 is 0x0D (CR )
            printf("AT+CMGS=\"9124502924\"%c",13);
						delay(20);           //Type your mobile number Eg : "9884467058"
            printf("Rs %d withdrawn from card 5100xxxxxx2E. Avl bal Rs %d",w,b); 
						delay(20);  //Type text as u want
            printf("%c",0x1A);  
						delay(20);  //line feed command
						delay(80);
											
											break;
																}
										}
									}			
										
          }
            else
            wrong();
        }
        
        else if(strncmp(rfid,"E510028E3B42",12)==0)
            {
						lcdcmd(1);
						lcdstring("Enter Ur PIN :");
						lcdcmd(0xc0);
            keypad();
            if(strncmp(pass,"1111",4)==0)
            {
            accept();
            lcdcmd(1);
            lcdstring("Access Granted ");
            lcdcmd(0xc0);
            lcdstring("Person1");
            delay(100);
						lcdcmd(1);
            lcdstring("press sw1: BALNC");
            lcdcmd(0xc0);
            lcdstring("press sw2: WITDR");
							delay(10);
						while(1)
						{
										if(sw1==0)
										{
													lcdcmd(1);
													lcdstring("Your balance is :");
													lcdcmd(0xc0);
													lcd_num(b);
											delay(100);
											break;
										}
										else if(sw2==0)
										{
													int k=0;
													lcdcmd(1);
													lcdstring("Enter amnt WDR:");
													lcdcmd(0xc0);
													keypad();
													w=my_atoi(pass);
																if(b<w)
																{
																		lcdcmd(1);
																		lcdstring("Insufficient Balance");
																		lcdcmd(0xc0);
																		lcdstring("Thanks visit AGAIN");
																		delay(800);
																		break;
																}
																else
																{
													b=b-w;
													lcdcmd(1);
													lcdstring("Your balance is : ");
													lcdcmd(0xc0);
													lcd_num(b);
													delay(800);
											
											 uart_init();                                                                                                 //serial initialization
            						printf("AT+CMGF=1%c",13);    
						delay(20);  //Text Mode            | hex value of 13 is 0x0D (CR )
            printf("AT+CMGS=\"9853200835\"%c",13);
						delay(20);           //Type your mobile number Eg : "9884467058"
            printf("Rs %d withdrawn from card 5100xxxxxx2E. Avl bal Rs %d",w,b); 
						delay(20);  //Type text as u want
            printf("%c",0x1A);  
						delay(20);  //line feed command
						delay(80);
						break;
																}
										}
									}
										
          }
            else
            wrong();
      }
            
            else 
        {
           lcdcmd(1);
           lcdstring("Access Denied");
           buzzer=1;
           delay(400);
           buzzer=0;
        }
  }
}